#include "filme.h"

std::string Filme::getCountry() const {
        return country;
    }

    std::string Filme::getDirector() const {
        return director;
    }

    char* Filme::getKey() const{
        return (char*)key;
    }

    std::string Filme::getOriginTitle() const {
        return originTitle;
    }


    std::string Filme::getPortTitle() const {
        return portTitle;
    }


    char* Filme::getReleaseYear() const {
        return (char*)releaseYear;
    }

    char Filme::getStars() const {
        return stars;
    }

    void Filme::setStars(char stars) {
        this->stars = stars;
    }
    
    Filme::Filme(std::string port, std::string orig, std::string dir, std::string ano, std::string pais, char nota){
        int i;
        portTitle = port;
        originTitle = orig;
        director = dir;
        for (i=0; i < 4; i++)
            releaseYear[i] = ano[i];
        releaseYear[4]= '\0';
        country = pais;
        stars = nota;
        for (i=0; i < 3; i++)
            key[i] = dir[i];
        for (i=3; i < 5; i++)
            key[i] = ano[i-1];
        key[5] = '\0';
    
    }
 IndicePrimario::IndicePrimario(char* pkey, int r){
     int i;
     for (i=0; i < 5; i++)
            key[i] = pkey[i];
     key[5]='\0';
     endereco = r;
 }
 char* IndicePrimario::getkey() const{
     return (char*)key;
 }
 int IndicePrimario::getendereco() const{
     return endereco;
 }

 IndiceSecundario::IndiceSecundario(char* pkey, std::string port){
     int i;
     for (i=0; i < 5; i++)
            key[i] = pkey[i];
     key[5]='\0';
     portTitle = port;
     
 }

 std::string IndiceSecundario::getportTitle() const{
     return portTitle;
 }
 char* IndiceSecundario::getkey() const{
     return (char*)key;
 }
void abreArquivos(){
        FILE *data, *pkey, *skey;
        data = pkey = skey = NULL;
        if((data = fopen("movie.dat", "r+")) == NULL)
                data = fopen("movie.dat", "w+");
        if((pkey = fopen("iprimary.idx", "r+")) == NULL)
                pkey = fopen("iprimary.idx", "w+");
        if((skey = fopen("ititle.idx", "r+")) == NULL)
                skey = fopen("ititle.idx", "w+");
        fclose(data);
        fclose(pkey);
        fclose(skey);
}
void inserirFilme(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS){
    int i = 0;
    Filme* xpto;
    std::string tituloPortugues, tituloOriginal, diretor, pais, ano;
    char nota;
    std::cout << "Digite o nome do filme em português: " << std::endl;
    std::getline(std::cin, tituloPortugues);
    maiuscula(tituloPortugues);
    std::cout << "Digite o nome original do filme: " << std::endl;
    std::getline(std::cin, tituloOriginal);
    maiuscula(tituloOriginal);
    std::cout << "Digite o nome do Diretor do filme: " << std::endl;
    std::getline(std::cin, diretor);
    maiuscula(diretor);
    std::cout << "Digite o ano de lançamento do filme: " << std::endl;
    std::getline(std::cin, ano);
    std::cout << "Digite o país de origem do filme: " << std::endl;
    std::getline(std::cin, pais);
    maiuscula(pais);
    std::cout << "Digite a nota que você dá ao filme: " << std::endl;
    std::cin >> nota;
    i = tituloPortugues.size()+tituloOriginal.size()+diretor.size()+pais.size();
    //std::cout << i << std::endl;
    if (i > 175){
        std::cout << "Você estorou o limite máximo de caracteres em " << i << " por favor, reescreva os titulos" << std::endl;
    }
    else{
        xpto = new Filme(tituloPortugues, tituloOriginal, diretor, ano, pais, nota);
        /*std::cout << xpto->getPortTitle() << std::endl;
        std::cout << xpto->getOriginTitle() << std::endl;
        std::cout << xpto->getDirector() << std::endl;
        std::cout << xpto->getReleaseYear() << std::endl;
        std::cout << xpto->getCountry() << std::endl;
        std::cout << xpto->getStars() << std::endl;
        std::cout << xpto->getKey() << std::endl;*/
        if(registrarArquivo(xpto, i, iP, iS) == true)
            std::cout << "Registro gravado com sucesso." << std::endl;
        else
            std::cout << "Registro não gravado" << std::endl;
    }
    
        
}
void maiuscula(std::string & str){
        int i;
        for (i = 0; i < str.length(); i++)
            str[i] = std::toupper(str[i]);
  }
     
bool registrarArquivo( const Filme *xpto, int &i, std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS){   
    IndicePrimario* iprime;
    IndiceSecundario* isec;
    //int fileEnd;
    std::string paraArquivo;
    /*paraArquivo = xpto->getKey()+'@'+xpto->getPortTitle()+'@'+xpto->getOriginTitle()+'@'+
            xpto->getDirector()+'@'+xpto->getReleaseYear()+'@'+xpto->getCountry()+'@'+
            xpto->getStars()+'@';*/
    //std::cout << ":::::::::: "<< paraArquivo << ":::::::::: "<< "tem: " << paraArquivo.size()<<std::endl;
    int j;
    int fileSize=0;
    //std::cout << ":::::valor de i[0]:::::: " << i << std::endl;
   // std::cout << ":::::valor de i[1]:::::: " << i << std::endl;
    //i = 191-paraArquivo.size();
   // std::cout << ":::::valor de i[2]:::::: " << i << std::endl;
    FILE * countfile = fopen ("movie.dat", "a+");
     fseek(countfile, 0, SEEK_END );
     fileSize=ftell (countfile);
   //  std::cout << "rrn:" << fileSize << std::endl;
     for (j=0; j< 5; j++)
        putc(xpto->getKey()[j], countfile);
     putc ('@', countfile);
     for (j=0; j< xpto->getPortTitle().size(); j++)
        putc(xpto->getPortTitle()[j], countfile);
     putc ('@', countfile);
     for (j=0; j< xpto->getOriginTitle().size(); j++)
        putc(xpto->getOriginTitle()[j], countfile);
     putc ('@', countfile);
     for (j=0; j< xpto->getDirector().size(); j++)
        putc(xpto->getDirector()[j], countfile);
     putc ('@', countfile);
     for (j=0; j< 4; j++)
        putc(xpto->getReleaseYear()[j], countfile);
     putc ('@', countfile);
     for (j=0; j< xpto->getCountry().size(); j++)
        putc(xpto->getCountry()[j], countfile);
     putc ('@', countfile);
     putc(xpto->getStars(), countfile);
     putc ('@', countfile);
     i = 192-(ftell(countfile)-fileSize);
    // std::cout << ":::::Falta examente para 191::::: " << i << std::endl;
     for (j=0; j < i; j++)
         putc('#', countfile);
     //putc('\n', countfile);        
    fclose (countfile);
    /*
     std::fstream filestr;

     filestr.open("movie.dat", std::fstream::out | std::fstream::app);
     std::cout << "rrn:" << fileSize << std::endl;
     filestr << paraArquivo;
     for (j=0; j < i; j++)
         filestr << '#';
     filestr << '\n';
  filestr.close();*/
  iprime = new IndicePrimario(xpto->getKey(), fileSize );
  isec = new IndiceSecundario(xpto->getKey(), xpto->getPortTitle());
  iP->push_back(*iprime);
  iS->push_back(*isec);
  delete xpto;
  delete iprime;
  delete isec;
  return true;

}
void copiaIndicePrimario(std::vector<IndicePrimario> *Indice){
//    int i;
    std::fstream iprimary;
    iprimary.open("iprimary.idx", std::fstream::in | std::fstream::out);
    if (!iprimary.is_open())
        std::cout << "Erro ao abrir o arquivo" << std::endl;
    else{
        while (!EOF){
            
        }
    }
}
void salvarIndice(std::vector<IndicePrimario> *iP){
    int i;
    std::fstream iprimary;
    iprimary.open("iprimary.idx", std::fstream::in | std::fstream::out |std::fstream::trunc);
    if (!iprimary.is_open())
        std::cout << "Erro ao abrir o arquivo" << std::endl;
    else{
        for(i = 0; i < iP->size(); i++){
            iprimary << iP->at(i).getkey()<<'@'<< iP->at(i).getendereco()<<'@'<< '\n';

        }
        iprimary.close();
    }
    
    
}
void salvaIndiceSec(std::vector<IndiceSecundario> *iS){
    int i, j;
    
    FILE * countfile = fopen ("ititle.idx", "w+");
     fseek(countfile, 0, SEEK_END );
     for(i = 0; i < iS->size(); i++){
        for (j=0; j< iS->at(i).getportTitle().size(); j++)
                putc(iS->at(i).getportTitle()[j], countfile);
        putc('@', countfile);
        for (j=0; j < 5; j++)
            putc(iS->at(i).getkey()[j], countfile);
        putc('@', countfile);
        putc('\n', countfile);
     }        
    fclose (countfile);
    
    
   /*
    std::string palavra;
    std::fstream ititle;
    ititle.open("ititle.idx", std::fstream::in | std::fstream::out |std::fstream::trunc);
    if (!ititle.is_open())
        std::cout << "Erro ao abrir o arquivo" << std::endl;
    else{
        for(i = 0; i < iS->size(); i++){
            palavra = iS->at(i).getportTitle()+'@'+iS->at(i).getkey()+'@';
            std::cout << ":::::::::palavra::::: " << palavra << std::endl;
        }
        ititle.close();
    }
   */ 
}
void ordenarIndice(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS){
    std::vector<IndicePrimario>::iterator i;
    
    std::sort (iP->begin()->getkey(), iP->end()->getkey());
}